home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-03 / himath.zip / MATHDEMO.BAS < prev    next >
BASIC Source File  |  1991-10-04  |  25KB  |  639 lines

  1. '***************************************************************************
  2. '**** MATHDEMO.BAS Test Kevin Jorgensen's "HIMATH" Library
  3. '***************************************************************************
  4. DEFDBL A-Z
  5. CONST Pi = 3.141592653589793#
  6. CONST HalfPi = Pi / 2#
  7. CONST TwoPi = Pi * 2#
  8.  
  9. TYPE VRect         'User type for 3d Vector Math
  10.   x AS DOUBLE
  11.   y AS DOUBLE
  12.   z AS DOUBLE
  13. END TYPE
  14.  
  15. TYPE XRect         'User Type for Complex Numbers
  16.   i AS DOUBLE
  17.   j AS DOUBLE
  18. END TYPE
  19.  
  20.  
  21. '======================================================================
  22. 'Math Demo Routines
  23. '======================================================================
  24. DECLARE SUB TestHold ()
  25. DECLARE SUB TestMatrix1 ()
  26. DECLARE SUB TestMatrix2 ()
  27. DECLARE SUB TestMatrixLoad (GivenMtx#(), A$)
  28. DECLARE SUB TestMatrixPrint (MtxErr%, Mtx())
  29. DECLARE SUB TestInvTrig ()
  30. DECLARE SUB TestTriangle ()
  31. DECLARE SUB TestTriangle2 (s$, p1#, p2#, p3#)
  32. DECLARE SUB TestVector ()
  33. DECLARE SUB TestVectorLoad (GivenVctr AS ANY, A$)
  34. DECLARE SUB TestVectorPrint (GivenVctr AS ANY)
  35. DECLARE SUB TestXmath ()
  36. DECLARE SUB TestXMatrix1 ()
  37. DECLARE SUB TestXMatrix2 ()
  38. DECLARE SUB TestXMatrixLoad (GivenMtx() AS XRect, A$)
  39. DECLARE SUB TestXMatrixPrint (MtxErr%, Mtx() AS XRect)
  40.  
  41. '======================================================================
  42. '======================================================================
  43. 'Demo'd in TestInvTrig
  44.   DECLARE FUNCTION ACOS (x)
  45.   DECLARE FUNCTION ASIN (y)
  46.   DECLARE FUNCTION ATAN2 (x, y)
  47.  
  48. 'Demo'd in TestTriangle
  49.   DECLARE SUB TriangleSolve (ProbType$, p1, p2, p3, A(), s(), NbrOfSolutions%)
  50.  
  51. 'Demo'd in TestMatrix1
  52.   DECLARE SUB MtxCoeff (MtxErr%, Mtx(), Vctr(), Coeff())
  53.   DECLARE SUB MtxCoeffA (MtxErr%, Mtx())
  54.   DECLARE SUB MtxCopy (MtxErr%, Src(), Dst())
  55.   DECLARE FUNCTION MtxDet (MtxErr%, Mtx())
  56.  
  57. 'Demo'd in TestMatrix2
  58.   DECLARE SUB MtxAdd (MtxErr%, A(), B(), C())
  59.   DECLARE SUB MtxSub (MtxErr%, A(), B(), C())
  60.   DECLARE SUB MtxInv (MtxErr%, A(), B())
  61.   DECLARE SUB MtxMltS (MtxErr%, A(), B, C())
  62.   DECLARE SUB MtxMltX (MtxErr%, A(), B(), C())
  63.  
  64. 'Demo'd in TestXmath
  65.   DECLARE SUB XCnvP (r, t, Result AS XRect)
  66.   DECLARE SUB XCnvR (i, j, Result AS XRect)
  67.  
  68.   DECLARE FUNCTION XMag (Op1 AS XRect)
  69.   DECLARE FUNCTION XAng (Op1 AS XRect)
  70.   DECLARE FUNCTION XReal (Op1 AS XRect)
  71.   DECLARE FUNCTION XImag (Op1 AS XRect)
  72.  
  73.   DECLARE FUNCTION XFmtP$ (Op1 AS XRect)
  74.   DECLARE FUNCTION XFmtR$ (Op1 AS XRect)
  75.  
  76.   DECLARE SUB XAdd (Op1 AS XRect, Op2 AS XRect, Result AS XRect)
  77.   DECLARE SUB XSub (Op1 AS XRect, Op2 AS XRect, Result AS XRect)
  78.   DECLARE SUB XMlt (Op1 AS XRect, Op2 AS XRect, Result AS XRect)
  79.   DECLARE SUB XDiv (Op1 AS XRect, Op2 AS XRect, Result AS XRect)
  80.   DECLARE SUB XPwr (Op1 AS XRect, Op2, Result AS XRect)
  81.   DECLARE SUB XCnj (Op1 AS XRect, Result AS XRect)
  82.   DECLARE SUB XInv (Op1 AS XRect, Result AS XRect)
  83.  
  84. 'Demo'd in TestXMatrix1
  85.   DECLARE SUB XMtxCoeff (MtxErr%, Mtx() AS XRect, Vctr() AS XRect, Coeff() AS XRect)
  86.   DECLARE SUB XMtxCoeffA (MtxErr%, Mtx() AS XRect)
  87.   DECLARE SUB XMtxCopy (MtxErr%, Src() AS XRect, Dst() AS XRect)
  88.   DECLARE SUB XMtxDet (MtxErr%, XMtx() AS XRect)
  89.  
  90. 'Demo'd in TestXMatrix2
  91.   DECLARE SUB XMtxAdd (MtxErr%, A() AS XRect, B() AS XRect, C() AS XRect)
  92.   DECLARE SUB XMtxInv (MtxErr%, A() AS XRect, Mtx() AS XRect)
  93.   DECLARE SUB XMtxMltS (MtxErr%, A() AS XRect, B AS XRect, C() AS XRect)
  94.   DECLARE SUB XMtxMltX (MtxErr%, A() AS XRect, B() AS XRect, C() AS XRect)
  95.   DECLARE SUB XMtxSub (MtxErr%, A() AS XRect, B() AS XRect, C() AS XRect)
  96.  
  97. 'Demo'd in TestVector
  98.   DECLARE SUB VAdd (Op1 AS VRect, Op2 AS VRect, Result AS VRect)
  99.   DECLARE SUB VMltX (Op1 AS VRect, Op2 AS VRect, Result AS VRect)
  100.   DECLARE SUB VSub (Op1 AS VRect, Op2 AS VRect, Result AS VRect)
  101.   DECLARE FUNCTION VMltD (Op1 AS VRect, Op2 AS VRect)
  102.  
  103. '======================================================================
  104.  
  105.   RANDOMIZE TIMER
  106.   TestInvTrig
  107.   TestTriangle
  108.   TestMatrix1
  109.   TestMatrix2
  110.   TestXmath
  111.   TestXMatrix1
  112.   TestXMatrix2
  113.   TestVector
  114. END
  115.  
  116. '======================================================================
  117. SUB TestHold
  118. '======================================================================
  119.   PRINT "Press Enter to Continue ";
  120.   x = CSRLIN
  121.   DO
  122.   LOOP UNTIL INKEY$ <> ""
  123.   LOCATE x, 1: PRINT SPACE$(40)
  124.  
  125. END SUB
  126.  
  127. '======================================================================
  128. SUB TestInvTrig
  129. '======================================================================
  130.   CLS
  131.   PRINT "SUB TestInvTrig  Demonstrating of ASIN, ACOS, and ATAN functions"
  132.   PRINT
  133.   PRINT "Given --------------------------- Calc'd -------------------"
  134.   PRINT "ang      SIN     COS          TAN     ASIN     ACOS     ATAN"
  135.   PRINT "---  ------- ------- ------------ -------- -------- --------"
  136.   FOR x = 0 TO 360 STEP 30
  137.     t = x / 180 * Pi
  138.     xsin = SIN(t)
  139.     xcos = COS(t)
  140.     xtan = TAN(t)
  141.     ysin = ASIN(xsin) * 180# / Pi
  142.     ycos = ACOS(xcos) * 180# / Pi
  143.     ytan = ATAN2(xcos, xsin) * 180# / Pi
  144.     IF ABS(xtan) >= 0 AND ABS(xtan) < 99999 THEN
  145.       PRINT USING "###  ##.#### ##.#### #####.###### ####.### ####.### ####.###"; x; xsin; xcos; xtan; ysin; ycos; ytan
  146.     ELSE
  147.       PRINT USING "###  ##.#### ##.#### ##.#####^^^^ ####.### ####.### ####.###"; x; xsin; xcos; xtan; ysin; ycos; ytan
  148.     END IF
  149.   NEXT x
  150.   TestHold
  151. END SUB
  152.  
  153. '======================================================================
  154. SUB TestMatrix1
  155. '======================================================================
  156.   Rows% = 8: ColVctr% = Rows% + 1
  157.   DIM ScratchMtx(Rows%, ColVctr%), GivenMtx(Rows%, ColVctr%)
  158.   DIM ScratchMtx2(Rows%, Rows%), Vctr(Rows%), Coeff(Rows%)
  159.   CLS
  160.   PRINT "SUB TestMatrix1  Demonstrating MtxCoeff, MtxCoeffA, MtxCopy, MtxDet"
  161.  
  162.   TestMatrixLoad GivenMtx(), "A"
  163.  
  164. '***************************************************************************
  165. '***************************************************************************
  166.   PRINT "╔══ Calculate Determinant using MtxDet ═════════════════════════════════════"
  167.   MtxCopy MtxErr%, GivenMtx(), ScratchMtx()
  168.   PRINT "║ Determinant = "; MtxDet(MtxErr%, ScratchMtx())
  169.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  170.  
  171. '***************************************************************************
  172. '***************************************************************************
  173.   PRINT "╔══ Calculate Coefficients using MtxCoeffA ═════════════════════════════════"
  174.   'The Column Vector Must be in the last colum of the array
  175.   'ie. if the matrix is 5x5, the colum vector should be in column 6
  176.   MtxCopy MtxErr%, GivenMtx(), ScratchMtx()
  177.   MtxCoeffA MtxErr%, ScratchMtx()
  178.   'TestMatrixPrint MtxErr%, ScratchMtx()
  179.   PRINT "║";
  180.   FOR i% = 1 TO Rows%
  181.     PRINT USING " ##.####"; ScratchMtx(i%, ColVctr%);
  182.   NEXT i%
  183.   PRINT
  184.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  185.  
  186. '***************************************************************************
  187. '***************************************************************************
  188.   PRINT "╔══ Calculate Coefficients using MtxCoeff ═════════════════════════════════"
  189.   FOR i% = 1 TO Rows%
  190.     Vctr(i%) = GivenMtx(i%, ColVctr%)
  191.   NEXT i%
  192.   MtxCopy MtxErr%, GivenMtx(), ScratchMtx2()
  193.   MtxCoeff MtxErr%, ScratchMtx2(), Vctr(), Coeff()
  194.   PRINT "║";
  195.   FOR i% = 1 TO Rows%
  196.     PRINT USING " ##.####"; Coeff(i%);
  197.   NEXT i%
  198.   PRINT
  199.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  200.   TestHold
  201. END SUB
  202.  
  203. '======================================================================
  204. SUB TestMatrix2
  205. '======================================================================
  206.   DIM MtxA(3, 3), MtxB(3, 3), MtxC(3, 3)
  207. '======================================================================
  208.   CLS
  209.   PRINT "SUB TestMatrix2   Demonstrating  MtxAdd"
  210.   TestMatrixLoad MtxA(), "A"
  211.   TestMatrixLoad MtxB(), "B"
  212.   MtxAdd Merr%, MtxA(), MtxB(), MtxC()
  213.   PRINT "╔══ Calculate Sum of two Matrices using MtxAdd ═════════════════════════════"
  214.   TestMatrixPrint Merr%, MtxC()
  215.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  216.   TestHold
  217.  
  218.   CLS
  219.   PRINT "SUB TestMatrix2   Demonstrating  MtxSub"
  220.   TestMatrixLoad MtxA(), "A"
  221.   TestMatrixLoad MtxB(), "B"
  222.   MtxSub Merr%, MtxA(), MtxB(), MtxC()
  223.   PRINT "╔══ Calculate Difference of two Matrices (A-B) using MtxSub ═════════════════"
  224.   TestMatrixPrint Merr%, MtxC()
  225.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  226.   TestHold
  227.  
  228.   CLS
  229.   PRINT "SUB TestMatrix2   Demonstrating  MtxInv"
  230.   TestMatrixLoad MtxA(), "A"
  231.   MtxCopy Merr%, MtxA(), MtxB()
  232.   MtxInv Merr%, MtxA(), MtxC()
  233.   PRINT "╔══ Calculate Inverse of Matrix using MtxInv ═══════════════════════════════"
  234.   TestMatrixPrint Merr%, MtxC()
  235.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  236.   
  237.   MtxInv Merr%, MtxC(), MtxA()
  238.   PRINT "╔══ Calculate Inverse of Inverse using MtxInv ═══════════════════════════════"
  239.   TestMatrixPrint Merr%, MtxA()
  240.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  241.   TestHold
  242.  
  243.   CLS
  244.   PRINT "SUB TestMatrix2   Demonstrating  MtxMltX"
  245.   TestMatrixLoad MtxA(), "A"
  246.   TestMatrixLoad MtxB(), "B"
  247.   MtxMltX Merr%, MtxA(), MtxB(), MtxC()
  248.   PRINT "╔══ Calculate Matrix Cross Product (AxB) ═══════════════════════════════════"
  249.   TestMatrixPrint Merr%, MtxC()
  250.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  251.   TestHold
  252.  
  253.   CLS
  254.   PRINT "SUB TestMatrix2   Demonstrating  MtxMltS"
  255.   TestMatrixLoad MtxA(), "A"
  256.   Scalar# = 20 * RND - 10
  257.   PRINT
  258.   PRINT "Scalar = "; Scalar#
  259.   PRINT
  260.   MtxMltS Merr%, MtxA(), Scalar#, MtxC()
  261.   PRINT "╔══ Calculate Matrix Scalar Product (A∙B) ═══════════════════════════════════"
  262.   TestMatrixPrint Merr%, MtxC()
  263.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  264.   TestHold
  265. END SUB
  266.  
  267. '======================================================================
  268. SUB TestMatrixLoad (GivenMtx(), A$)
  269. '======================================================================
  270.   PRINT "╔══ Generating ORIGINAL MATRIX '"; A$; "' ══════════════════════════════════════════"
  271.   Rows% = UBOUND(GivenMtx, 1)
  272.   Cols% = UBOUND(GivenMtx, 2)
  273.   FOR row% = 1 TO Rows%
  274.     FOR col% = 1 TO Cols%
  275.       GivenMtx(row%, col%) = RND * 20 - 10
  276.     NEXT col%
  277.   NEXT row%
  278.   TestMatrixPrint MtxErr%, GivenMtx()
  279.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  280.  
  281. END SUB
  282.  
  283. '===========================================================================
  284. SUB TestMatrixPrint (MtxErr%, Mtx())
  285. '===========================================================================
  286.   MtxErr% = 1
  287.   Rows% = UBOUND(Mtx, 1): Cols% = UBOUND(Mtx, 2)
  288.   ColWidth% = 74 / Cols%
  289.   f$ = STRING$(ColWidth%, "#")
  290.   MID$(f$, (ColWidth% + 1) / 2, 1) = "."
  291.   IF ColWidth% > 15 THEN f$ = RIGHT$(SPACE$(ColWidth%) + "#######.#######", ColWidth%)
  292.   MtxErr% = 0
  293.   DispStartRow% = CSRLIN
  294.   IF (DispStartRow% + Rows% + 1) > 24 THEN CLS : DispStartRow% = 1
  295.   PRINT "    ";
  296.   FOR col% = 1 TO Cols%
  297.     PRINT USING SPACE$(ColWidth% - 2) + "##"; col%;
  298.   NEXT col%
  299.   PRINT : PRINT "    ";
  300.   FOR col% = 1 TO Cols%
  301.     PRINT " "; STRING$(ColWidth% - 1, "-");
  302.   NEXT col%
  303.   FOR row% = 1 TO Rows%
  304.     LOCATE DispStartRow% + row% + 1, 1: PRINT USING "##: "; row%;
  305.   NEXT row%
  306.  
  307.   FOR row% = 1 TO Rows%
  308.     FOR col% = 1 TO Cols%
  309.       LOCATE row% + DispStartRow% + 1, (col% - 1) * ColWidth% + 5
  310.       PRINT USING f$; Mtx(row%, col%)
  311.     NEXT col%
  312.   NEXT row%
  313.  
  314. END SUB
  315.  
  316. '======================================================================
  317. SUB TestTriangle
  318. '======================================================================
  319.   DIM GivenSide(3), GivenAngle(3)
  320. '======================================================================
  321.   CLS
  322.   PRINT "SUB TestTriangle  Demonstrating TriangleSolve"
  323.   PRINT
  324.   TriangleSolve "SSS", 3#, 4#, 5#, GivenAngle(), GivenSide(), Solutions%
  325.   TestTriangle2 "SAS", (GivenSide(1)), (GivenAngle(3)), (GivenSide(2))
  326.   TestTriangle2 "ASA", (GivenAngle(1)), (GivenSide(3)), (GivenAngle(2))
  327.   TestTriangle2 "AAS", (GivenAngle(1)), (GivenAngle(2)), (GivenSide(1))
  328.   TestHold
  329.  
  330.   CLS
  331.   PRINT "SUB TestTriangle  Demonstrating TriangleSolve"
  332.   PRINT
  333.   TestTriangle2 "SAS", (GivenSide(1)), (GivenAngle(3)), (GivenSide(2))
  334.   TestTriangle2 "SSA", (GivenSide(1)), (GivenSide(2)), (GivenAngle(1))
  335.   TestTriangle2 "SSS", (GivenSide(1)), (GivenSide(2)), (GivenSide(3))
  336.   TestHold
  337.  
  338. END SUB
  339.  
  340. '======================================================================
  341. SUB TestTriangle2 (s$, p1, p2, p3)
  342. '======================================================================
  343.   DIM CalcAngle(3), CalcSide(3)
  344. '======================================================================
  345.  
  346.   PRINT "╔════════════════════════════════════════════════════════════════════════"
  347.   SELECT CASE s$
  348.   CASE "ASA"
  349.     x1 = p1 * 180 / Pi: x2 = p2: x3 = p3 * 180 / Pi
  350.     PRINT USING "║Given: ASA, ####.####(Angle 1)  ####.####( Side 3)  ####.####(Angle 2)"; x1; x2; x3
  351.   CASE "AAS"
  352.     x1 = p1 * 180 / Pi: x2 = p2 * 180 / Pi: x3 = p3
  353.     PRINT USING "║Given: AAS, ####.####(Angle 1)  ####.####(Angle 2)  ####.####( Side 1)"; x1; x2; x3
  354.   CASE "SAS"
  355.     x1 = p1: x2 = p2 * 180 / Pi: x3 = p3
  356.     PRINT USING "║Given: SAS, ####.####( Side 1)  ####.####(Angle 3)  ####.####( Side 2)"; x1; x2; x3
  357.   CASE "SSA"
  358.     x1 = p1: x2 = p2: x3 = p3 * 180 / Pi
  359.     PRINT USING "║Given: SSA, ####.####( Side 1)  ####.####( Side 2)  ####.####(Angle 1)"; x1; x2; x3
  360.   CASE "SSS"
  361.     x1 = p1: x2 = p2: x3 = p3
  362.     PRINT USING "║Given: SSS, ####.####( Side 1)  ####.####( Side 2)  ####.####( Side 3)"; x1; x2; x3
  363.   CASE ELSE
  364.   END SELECT
  365.  
  366.   FOR try% = 1 TO 2
  367.     PRINT "╟──────────────────────────────────────────────────────────────────────"
  368.     IF Solutions% = 2 THEN PRINT "║ **** SECOND SOLUTION ****"
  369.     TriangleSolve s$, p1, p2, p3, CalcAngle(), CalcSide(), Solutions%
  370.     PRINT USING "║Results:     ###.####( Side 1)   ###.####( Side 2)   ###.####( Side 3)"; CalcSide(1); CalcSide(2); CalcSide(3)
  371.     PRINT USING "║Results:     ###.####(Angle 1)   ###.####(Angle 2)   ###.####(Angle 3)"; CalcAngle(1) / Pi * 180; CalcAngle(2) / Pi * 180; CalcAngle(3) / Pi * 180
  372.     IF Solutions% = 1 THEN EXIT FOR
  373.   NEXT try%
  374.   PRINT "╚════════════════════════════════════════════════════════════════════════"
  375.  
  376. END SUB
  377.  
  378. '======================================================================
  379. SUB TestVector
  380. '======================================================================
  381.   DIM VctrA AS VRect, VctrB AS VRect, VctrC AS VRect
  382. '======================================================================
  383.   CLS
  384.   PRINT "SUB TestVector   Demonstrating  VAdd, VSub, VMltX, VMltD"
  385.   TestVectorLoad VctrA, "A"
  386.   TestVectorLoad VctrB, "B"
  387.   VAdd VctrA, VctrB, VctrC
  388.   PRINT "╔══ Calculate Sum of two Vectors using VAdd ═════════════════════════════"
  389.   TestVectorPrint VctrC
  390.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  391.   
  392.  
  393.   VSub VctrA, VctrB, VctrC
  394.   PRINT "╔══ Calculate Difference of two Vectors (A-B) using VSub ═════════════════"
  395.   TestVectorPrint VctrC
  396.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  397.  
  398.  
  399.   VMltX VctrA, VctrB, VctrC
  400.   PRINT "╔══ Calculate Vector Cross Product (AxB) using VMltX ════════════════════"
  401.   TestVectorPrint VctrC
  402.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  403.   
  404.   PRINT "╔══ Calculate Vector Dot Product (A∙B) ═════════════════════════════════════"
  405.   PRINT VMltD(VctrA, VctrB)
  406.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  407.   TestHold
  408.  
  409. END SUB
  410.  
  411. '======================================================================
  412. SUB TestVectorLoad (GivenVctr AS VRect, A$)
  413. '======================================================================
  414.   PRINT "╔══ Generating ORIGINAL Vector '"; A$; "' ══════════════════════════════════════════"
  415.   GivenVctr.x = RND * 20 - 10
  416.   GivenVctr.y = RND * 20 - 10
  417.   GivenVctr.z = RND * 20 - 10
  418.   TestVectorPrint GivenVctr
  419.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  420.  
  421. END SUB
  422.  
  423. '======================================================================
  424. SUB TestVectorPrint (GivenVctr AS VRect)
  425. '======================================================================
  426.   PRINT USING "+###.####x+###.####y+###.####z"; GivenVctr.x; GivenVctr.y; GivenVctr.z
  427. END SUB
  428.  
  429. '======================================================================
  430. SUB TestXmath
  431. '======================================================================
  432. DIM Op1 AS XRect, Op2 AS XRect, Result AS XRect
  433. '======================================================================
  434.  
  435.   CLS
  436.   PRINT "SUB TestXmath  Demonstrating Complex Arithmetic Functions"
  437.   PRINT
  438.  
  439.   i = 20 * RND - 10: j = 20 * RND - 10
  440.   XCnvR i, j, Op1
  441.   PRINT "Given Op1 = "; XFmtR(Op1), XFmtP(Op1)
  442.  
  443.   r = 20 * RND - 10: t = TwoPi * RND - Pi
  444.   XCnvP r, t, Op2
  445.   PRINT "Given Op2 = "; XFmtR(Op2), XFmtP(Op2)
  446.  
  447.   PRINT
  448.   PRINT "Magnitude  XMag(Op1)     "; XMag(Op1)
  449.   PRINT "Angle      XAng(Op1)     "; XAng(Op1), XAng(Op1) * 180 / Pi; "°"
  450.   PRINT "Real       XReal(Op1)    "; XReal(Op1)
  451.   PRINT "Imaginary  XImag(Op1)    "; XImag(Op1)
  452.  
  453.   PRINT
  454.   PRINT "Magnitude  XMag(Op2)     "; XMag(Op2)
  455.   PRINT "Angle      XAng(Op2)     "; XAng(Op2), XAng(Op2) * 180 / Pi; "°"
  456.   PRINT "Real       XReal(Op2)    "; XReal(Op2)
  457.   PRINT "Imaginary  XImag(Op2)    "; XImag(Op2)
  458.  
  459.   PRINT
  460.   XAdd Op1, Op2, Result: PRINT "Add        Xadd(Op1,Op2)  "; XFmtP$(Result); TAB(55); XFmtR$(Result)
  461.   XSub Op1, Op2, Result: PRINT "Subtract   XSub(Op1,Op2)  "; XFmtP$(Result); TAB(55); XFmtR$(Result)
  462.   XMlt Op1, Op2, Result: PRINT "Multiply   XMlt(Op1,Op2)  "; XFmtP$(Result); TAB(55); XFmtR$(Result)
  463.   XDiv Op1, Op2, Result: PRINT "Divide     XDiv(Op1,Op2)  "; XFmtP$(Result); TAB(55); XFmtR$(Result)
  464.   XPwr Op1, Op2.i, Result: PRINT "Power      XPwr(Op1,Op2.i)"; XFmtP$(Result); TAB(55); XFmtR$(Result)
  465.   XCnj Op1, Result: PRINT "Conjugate  XCnj(Op1)      "; XFmtP$(Result); TAB(55); XFmtR$(Result)
  466.   XInv Op1, Result: PRINT "Inverse    XInv(Op1)      "; XFmtP$(Result); TAB(55); XFmtR$(Result)
  467.   TestHold
  468. END SUB
  469.  
  470. '======================================================================
  471. SUB TestXMatrix1
  472. '======================================================================
  473.   Rows% = 3: ColVctr% = Rows% + 1
  474.   DIM ScratchMtx(Rows%, ColVctr%) AS XRect
  475.   DIM GivenMtx(Rows%, ColVctr%) AS XRect
  476.   DIM ScratchMtx2(Rows%, Rows%) AS XRect
  477.   DIM Vctr(Rows%) AS XRect
  478.   DIM Coeff(Rows%) AS XRect
  479. '======================================================================
  480.   CLS
  481.   PRINT "Demonstrating XMtxCoeff, XMtxCopy, XMtxDet "
  482.  
  483.   TestXMatrixLoad GivenMtx(), "A"
  484.  
  485. '***************************************************************************
  486. '***************************************************************************
  487.   PRINT "╔══ Calculate Determinant using MtxDet ═════════════════════════════════════"
  488.   XMtxCopy MtxErr%, GivenMtx(), ScratchMtx()
  489.   XMtxDet MtxErr%, ScratchMtx()
  490.   PRINT "║ Determinant = "; XFmtR(ScratchMtx(0, 0))
  491.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  492.  
  493. '***************************************************************************
  494. '***************************************************************************
  495.   PRINT "╔══ Calculate Coefficients using XMtxCoeffA ═════════════════════════════════"
  496.   'The Column Vector Must be in the last colum of the array
  497.   'ie. if the matrix is 5x5, the colum vector should be in column 6
  498.   XMtxCopy MtxErr%, GivenMtx(), ScratchMtx()
  499.   XMtxCoeffA MtxErr%, ScratchMtx()
  500.   PRINT "║";
  501.   FOR i% = 1 TO Rows%
  502.     PRINT "   "; XFmtR(ScratchMtx(i%, ColVctr%));
  503.   NEXT i%
  504.   PRINT
  505.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  506.  
  507. '***************************************************************************
  508. '***************************************************************************
  509.   PRINT "╔══ Calculate Coefficients using MtxCoeff ═════════════════════════════════"
  510.   FOR i% = 1 TO Rows%
  511.     Vctr(i%) = GivenMtx(i%, ColVctr%)
  512.   NEXT i%
  513.   XMtxCopy MtxErr%, GivenMtx(), ScratchMtx2()
  514.   XMtxCoeff MtxErr%, ScratchMtx2(), Vctr(), Coeff()
  515.   PRINT "║";
  516.   FOR i% = 1 TO Rows%
  517.     PRINT "   "; XFmtR(Coeff(i%));
  518.   NEXT i%
  519.   PRINT
  520.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  521.   TestHold
  522.  
  523. END SUB
  524.  
  525. '======================================================================
  526. SUB TestXMatrix2
  527. '======================================================================
  528.   DIM MtxA(3, 3) AS XRect, MtxB(3, 3) AS XRect, MtxC(3, 3) AS XRect
  529.   DIM Scalar AS XRect
  530. '======================================================================
  531.   CLS
  532.   PRINT "Demonstrating  XMtxAdd, XMtxSub, XMtxInv, XMtxMltX, XMtxMltS"
  533.   TestXMatrixLoad MtxA(), "A"
  534.   TestXMatrixLoad MtxB(), "B"
  535.   XMtxAdd Merr%, MtxA(), MtxB(), MtxC()
  536.   PRINT "╔══ Calculate Sum of two Matrices using XMtxAdd ═════════════════════════════"
  537.   TestXMatrixPrint Merr%, MtxC()
  538.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  539.   TestHold
  540.  
  541.   CLS
  542.   PRINT "Demonstrating  XMtxAdd, XMtxSub, XMtxInv, XMtxMltX, XMtxMltS"
  543.   TestXMatrixLoad MtxA(), "A"
  544.   TestXMatrixLoad MtxB(), "B"
  545.   XMtxSub Merr%, MtxA(), MtxB(), MtxC()
  546.   PRINT "╔══ Calculate Difference of two Matrices (A-B) using MtxSub ═════════════════"
  547.   TestXMatrixPrint Merr%, MtxC()
  548.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  549.   TestHold
  550.  
  551.   CLS
  552.   PRINT "Demonstrating  XMtxAdd, XMtxSub, XMtxInv, XMtxMltX, XMtxMltS"
  553.   TestXMatrixLoad MtxA(), "A"
  554.   XMtxCopy Merr%, MtxA(), MtxB()
  555.   XMtxInv Merr%, MtxA(), MtxC()
  556.   PRINT "╔══ Calculate Inverse of Complex Matrix using XMtxInv ══════════════════════"
  557.   TestXMatrixPrint Merr%, MtxC()
  558.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  559.  
  560.   XMtxInv Merr%, MtxC(), MtxA()
  561.   PRINT "╔══ Calculate Complex Inverse of Inverse using XMtxInv ═════════════════════"
  562.   TestXMatrixPrint Merr%, MtxA()
  563.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  564.   TestHold
  565.  
  566.   CLS
  567.   PRINT "Demonstrating  XMtxAdd, XMtxSub, XMtxInv, XMtxMltX, XMtxMltS"
  568.   TestXMatrixLoad MtxA(), "A"
  569.   TestXMatrixLoad MtxB(), "B"
  570.   XMtxMltX Merr%, MtxA(), MtxB(), MtxC()
  571.   PRINT "╔══ Calculate Complex Matrix Cross Product (AxB) using XMtxMltX ════════════"
  572.   TestXMatrixPrint Merr%, MtxC()
  573.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  574.   TestHold
  575.  
  576.   CLS
  577.   PRINT "Demonstrating  XMtxAdd, XMtxSub, XMtxInv, XMtxMltX, XMtxMltS"
  578.   TestXMatrixLoad MtxA(), "A"
  579.   Scalar.i = 20 * RND - 10
  580.   Scalar.j = 20 * RND - 10
  581.   PRINT
  582.   PRINT "Scalar = "; XFmtR(Scalar)
  583.   PRINT
  584.   XMtxMltS Merr%, MtxA(), Scalar, MtxC()
  585.   PRINT "╔══ Calculate Complex Matrix Scalar Product (A∙B) using XMtxMltS ═══════════"
  586.   TestXMatrixPrint Merr%, MtxC()
  587.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  588.   TestHold
  589.  
  590. END SUB
  591.  
  592. '======================================================================
  593. SUB TestXMatrixLoad (GivenMtx() AS XRect, A$)
  594. '======================================================================
  595.   PRINT "╔══ Generating ORIGINAL MATRIX '"; A$; "'═══════════════════════════════════════════"
  596.   Rows% = UBOUND(GivenMtx, 1)
  597.   Cols% = UBOUND(GivenMtx, 2)
  598.   FOR row% = 1 TO Rows%
  599.     FOR col% = 1 TO Cols%
  600.       GivenMtx(row%, col%).i = RND * 20 - 10
  601.       GivenMtx(row%, col%).j = RND * 20 - 10
  602.     NEXT col%
  603.   NEXT row%
  604.   TestXMatrixPrint MtxErr%, GivenMtx()
  605.   PRINT "╚═══════════════════════════════════════════════════════════════════════════"
  606.  
  607. END SUB
  608.  
  609. '===========================================================================
  610. SUB TestXMatrixPrint (MtxErr%, Mtx() AS XRect)
  611. '===========================================================================
  612.   MtxErr% = 1
  613.   Rows% = UBOUND(Mtx, 1): Cols% = UBOUND(Mtx, 2)
  614.   ColWidth% = 74 / Cols%
  615.   MtxErr% = 0
  616.   DispStartRow% = CSRLIN
  617.   IF (DispStartRow% + Rows% + 1) > 24 THEN CLS : DispStartRow% = 1
  618.   PRINT "    ";
  619.   FOR col% = 1 TO Cols%
  620.     PRINT USING SPACE$(ColWidth% - 2) + "##"; col%;
  621.   NEXT col%
  622.   PRINT : PRINT "    ";
  623.   FOR col% = 1 TO Cols%
  624.     PRINT " "; STRING$(ColWidth% - 1, "-");
  625.   NEXT col%
  626.   FOR row% = 1 TO Rows%
  627.     LOCATE DispStartRow% + row% + 1, 1: PRINT USING "##: "; row%;
  628.   NEXT row%
  629.  
  630.   FOR row% = 1 TO Rows%
  631.     FOR col% = 1 TO Cols%
  632.       LOCATE row% + DispStartRow% + 1, (col% - 1) * ColWidth% + 5
  633.       PRINT USING "+##.###+##.###j"; Mtx(row%, col%).i; Mtx(row%, col%).j
  634.     NEXT col%
  635.   NEXT row%
  636.  
  637. END SUB
  638.  
  639.